﻿using System;
using Business.Entity.Fiscal;
using FluentNHibernate.Conventions;

namespace Business.NotaDaGente.ClassesRelacionadas
{
    public sealed class NotaDaGenteNotaFiscal : AbstractRegister<NotaFiscal>, IDisposable
    {

        public override string Gerar(NotaFiscal objeto)
        {
            AddCampo("20");
            AddCampo("1"); // Modelo D
            AddCampo("1"); // Sub série 1
            AddCampo(objeto.Numero);
            AddCampo(objeto.DataEmissao);
            AddCampo(objeto.DataEmissao); // Emissão é igual a saída.
            if (objeto.Destinatario.Nome.ToUpper().Equals("CONSUMIDOR"))
            {
                AddCampo(""); // Cnpj
                AddCampo(""); // Nome
                AddCampo(""); // Logradouro
                AddCampo(""); // Número
                AddCampo(""); // Complemento
                AddCampo(""); // Bairro
                AddCampo(""); // Cidade
                AddCampo(""); // UF
                AddCampo(""); // Cep
                AddCampo(""); // Telefone do cliente.
                // Chama o cálculo da nota fiscal.
                CalcularNota(objeto);
                AddCampo(TotalProduto);
                AddCampo(Desconto);
                AddCampo(Frete);
                AddCampo(Seguro);
                AddCampo(OutrosAcressimos);
                AddCampo("");
                AddCampo(ValorNota);
                AddCampo("");
                AddCampo("");
                AddCampo("2"); // Em registro de D1 não á informações de entrega.
                AddCampo("");
                AddCampo("");
                AddCampo("");
                AddCampo("");
                AddCampo("");
                AddCampo("");
                AddCampo(ValorNota);
            }
            else
            {
                AddCampo(objeto.Destinatario.CpfCnpj);
                AddCampo(objeto.Destinatario.Nome);
                if (objeto.Destinatario.Enderecos.IsEmpty())
                {
                    AddCampo(""); // Logradouro
                    AddCampo(""); // Número
                    AddCampo(""); // Complemento
                    AddCampo(""); // Bairro
                    AddCampo(""); // Cidade
                    AddCampo(""); // UF
                    AddCampo(""); // Cep
                }
                else
                {
                    AddCampo(objeto.Destinatario.Enderecos[0].Logradouro);
                    AddCampo(""); // Número
                    AddCampo(""); // Complemento
                    AddCampo(objeto.Destinatario.Enderecos[0].Endereco.Bairro.Nome);
                    AddCampo(objeto.Destinatario.Enderecos[0].Endereco.Cidade.Nome);
                    AddCampo(objeto.Destinatario.Enderecos[0].Endereco.Cidade.Estado.UF);
                    AddCampo(objeto.Destinatario.Enderecos[0].Endereco.Cep);
                }
                if (objeto.Destinatario.ContatoTelefonicos.IsEmpty())
                {
                    AddCampo(""); // Telefone do cliente.
                }
                else
                {
                    AddCampo(objeto.Destinatario.ContatoTelefonicos[0].Telefone); // Telefone do cliente.
                }
                // Chama o cálculo da nota fiscal.
                CalcularNota(objeto);
                AddCampo(TotalProduto);
                AddCampo(Desconto);
                AddCampo(Frete);
                AddCampo(Seguro);
                AddCampo(OutrosAcressimos);
                AddCampo("");
                AddCampo(ValorNota);
                AddCampo("");
                AddCampo("");
                AddCampo("2"); // Em registro de D1 não á informações de entrega.
                AddCampo("");
                AddCampo("");
                AddCampo("");
                AddCampo("");
                AddCampo("");
                AddCampo("");
                CalcularNota(objeto);
                AddCampo(ValorNota);
            }
            CrLf();
            foreach (var prod in objeto.Produtos)
            {
                using (var pNf = new NotaDaGenteProdutoNotaFiscal())
                {
                    Registro += pNf.Gerar(prod);
                }
            }
            return Registro;
        }

        private void CalcularNota(NotaFiscal objeto)
        {
            ValorNota = 0;
            TotalProduto = 0;
            Desconto = objeto.Desconto;
            Frete = objeto.Frete;
            Seguro = objeto.Seguro;
            OutrosAcressimos = objeto.OutrasDespesasAcessorias;

            foreach (var prod in objeto.Produtos)
            {
                TotalProduto += prod.ValorUnitario * prod.Quantidade;
            }
            ValorNota += TotalProduto - Desconto + Frete + Seguro + OutrosAcressimos;

        }
        public void Dispose()
        {
            Registro = "";

        }

        public decimal ValorNota { get; set; }
        public decimal TotalProduto { get; set; }
        public decimal Desconto { get; set; }
        public decimal Frete { get; set; }
        public decimal Seguro { get; set; }
        public decimal OutrosAcressimos { get; set; }
    }
}
